Gestione della Memoria in Informatica

Il compito del “gestore di memoria” è quello di tenere conto delle parti libere ed usate della memoria per allocarle o deallocarle ai processi.

Per completezza d’informazione descriveremo la gestione di memoria sia con che senza swapping.

GESTIONE SENZA SWAPPING
Con un solo processo in esecuzione ovviamente la gestione della memoria è estremamente semplice. Nel PC-IBM i gestori dei dispositivi risiedevano in una ROM, il Sistema Operativo in un piccolo spazio RAM mentre l’unico processo utente usava tutta la RAM rimanente.
Ovviamente questa gestione non è piu’ attuale in quanto ci si è resi conto che avere piu’ processi in esecuzione in timesharing rende migliore l’utilizzo della CPU.
Se sono in esecuzione più processi ciascuno di essi avrà necessità di una propria porzione di memoria. Una soluzione al problema della gestione della memoria con multitasking è la più evidente: suddividere la memoria in partizioni e creare delle code di attesa per i processi che desiderino utilizzarle. Un esempio classico è il sistema MFT (Memory with Fixed Tasks) suddivide la memoria disponibile in partizioni fisse ma di dimensioni differenti in modo da soddisfare le esigenze di processi più o meno ingombranti.

All’evidente primo svantaggio della gestione MFT che è il notevole spreco di memoria si aggiungono i problemi interconnessi della rilocazione e della protezione.

la rilocazione: ogni processo che viene eseguito viene posto in una partizione libera di memoria: il processo si troverà ad operare con altri indirizzi di memoria “spostati” rispetto alla sua programmazione originaria. Ad esempio se una istruzione del processo deve saltare all’indirizzo 124 ma si trova nella partizione da 200k a 400k è necessario “rilocare” l’indirizzo (ossia il nuovo indirizzo sarà 124+200=324).
la protezione: una conseguenza del partizionamento della memoria è che se, ad esempio, il processo 1 viene eseguito nella partizione [100 200] con una istruzione di salto a 120 un processo “malizioso” può oltrepassare il suo spazio ed interferire con la partizione di un altro processo. Una soluzione a questo grosso problema di sicurezza fu introdurre dei registri speciali chiamati base e limite che indicavano ai processi gli estremi della partizione da non oltrepassare.

GESTIONE CON SWAPPING
Ogni azione che sposti i processi della memoria sul disco fisso viene detta swapping…
Negli esempi precedenti abbiamo visto il semplice sistema di allocazione MFT a partizioni fisse. Un altro sistema consiste nella suddivisione della memoria in partizioni variabili dove il numero, la dimensione e la posizione delle partizioni variano dinamicamente e non sono prestabilite.
Risulta essere evidente che questo complica notevolmente il tener traccia della allocazione istante per istante. Esamineremo i tre modi con cui il sistema operativo può far questo: bitmap, liste concatenate e buddy system.

Uso di mappe binarie (bitmap)
La memoria viene suddivisa in unità di una grandezza determinata; a ciascuna di esse viene associato un bit che indica se è piena (1) oppure vuota (0). Più piccola è l’unità e più grande sarà la bitmap e ma se tale unità diventa troppo grande aumenterà lo spreco di memoria.
Un altro svantaggio delle bitmap è lo spreco di tempo che impiega la CPU a scorrere la mappa per cercare le holes (buchi) ossia gli spazi non allocati.

Uso di Liste Concatenate
Risulta essere un sistema molto simile alle bitmap ma è senza dubbio più pratico per tenere traccia dei segmenti liberi. R
Con questo sistema risulta non solo più veloce aggiornare gli spazi vuoti in memoria ma anche fondere due o tre buchi contigui.

Ora che abbiamo una buona mappa della memoria sorge un’ altra domanda: se ad un processo serve una certa quantità di memoria quale buco deve usare? Il più grande? Il primo che trova? Il più idoneo alle sue richieste? Per rispondere a questi dubbi sono stati ideati ed analizzati con simulazioni statistiche alcuni algoritmi per l’allocazione della memoria nelle liste:
First fit : viene scorsa la lista dall’inizio e viene usato il primo buco che può contenere il processo.
Next fit : uguale al first fit ma la seconda volta che viene applicato la ricerca nella lista riprende da dove si era trovato in precedenza un buco.
Best fit : cerca in tutta la lista e prende il più piccolo dei buchi che può essere usato
Quick fit : mantiene una lista dei buchi che hanno le grandezze più richieste.
Il problema principale delle liste è che l’operazione di deallocazione risulta lenta.

Buddy System
Anche chiamato con il nome di metodo dei compagni, il Buddy System è un algoritmo che sfrutta la naturale dimestichezza del calcolatore con il sistema binari.
Il gestore della memoria mantiene una lista di blocchi con dimensioni che seguono le potenze di 2.
Il sistema buddy risulta semplice e veloce ma causa un notevole spreco di memoria e frammentazione interna.

DUE REGOLE MATEMATICHE
Concludiamo questa parte ricordando due curiose regole ottenute da diverse simulazioni degli algoritmi spiegati in precedenza:
regola del 50 per cento:se il numero medio dei processi in memoria è n, il numero dei buchi è molto vicino a n/2.

Regola della memoria non usata:
siano: f = frazione di memoria con buchi

s = dimensione media dei processi

k*s = dimensione media dei buchi

m = memoria complessiva

In parole povere se la dimensione dei buchi è la metà di quella dei processi ricaviamo che f = 1/5 ossia che i buchi occupano il 20% dello spazio.